// 1. Set 的基本操作

// 初始化 set 集合
const set = new Set([1, 2, 2, 3])
// 1.1 添加元素
set.add(4)

// 1.2 删除元素
set.delete(4)

// 1.3 检查元素是否存在
console.log('isHas', set.has(3))

// 1.4 清空 set
// set.clear()

// 1.5 遍历 set
console.log('set', set)
set.forEach((item) => {
  console.log('item', item)
})

// 2. Map 的基本操作

// 初始化操作
const map = new Map()

// 2.1 添加键值对
map.set('name', 'kunkun')
map.set('age', '18')
map.set('hobby', ['唱', '跳', 'rap'])
map.set('sing', '鸡你太美')
// 2.2 获取值
console.log('name', map.get('name'))

// 2.3 删除值
map.delete('sing')
// console.log('map', map)

// 2.4 检查键是否存在
console.log('is has hobby', map.has('hobby'))

// 2.5 清空 map
// map.clear()
// console.log('map', map)

// 2.6 遍历 map
// map.forEach((val, key) => {
//   console.log('key - val', key, val)
// })

for (const [key, val] of map) {
  console.log('key', key, val)
}

// 3. WeakSet
// 定义：WeakSet 与 Set 类似，但它存储的引用是弱引用，如果 WeakSet 中引用的某个对象没有其他强引用指向他，垃圾回收机制可能会回收改对象，而不会考虑它是否存在于 WeakSet 中
// 内存管理：WeakSet 适用于哪些不需要长期引用的对象场景，例如缓存
// 初始化
const weakSet = new WeakSet()
let obj = {
  name: 'kunkun',
}
weakSet.add(obj)
console.log('weakSet - 0', weakSet)
obj = null // obj 被垃圾回收后，WeakSet 中的引用也会被移除
console.log('weakSet - 1', weakSet)

const cache = new WeakSet()
function addCache(obj) {
  cache.add(obj)
}
let user = { name: 'kunkun', age: 18, hobby: ['唱', '跳', 'rap'] }
addCache(user)
user = null
console.log('cache', cache)
